# 设置最低要求的CMake版本为3.5，如果版本低于此值则报致命错误
cmake_minimum_required ( VERSION 3.15 FATAL_ERROR )

# 定义项目名称为recipe-09，并指定使用的语言为C++ (CXX)
project ( recipe-09 LANGUAGES CXX )

# 在Windows平台上设置导出所有符号（适用于动态库）
set ( CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON )

# 添加一个名为animals的共享库目标，并列出源文件
add_library ( animals
  SHARED # 指定生成的是共享库（动态链接库）
    Animal.cpp # 动物基类的实现文件
    Animal.hpp # 动物基类的头文件
    Cat.cpp # 猫子类的实现文件
    Cat.hpp # 猫子类的头文件
    Dog.cpp # 狗子类的实现文件
    Dog.hpp # 狗子类的头文件
    Factory.hpp # 工厂类的头文件
)

# 为目标animals设置属性
set_target_properties ( animals
  PROPERTIES
    CXX_STANDARD 14 # 指定C++标准为C++14
    CXX_EXTENSIONS OFF # 禁用编译器特定的扩展，仅使用ISO标准
    CXX_STANDARD_REQUIRED ON # 要求必须支持指定的标准，否则报错
    POSITION_INDEPENDENT_CODE 1 # 启用位置无关代码（PIC），避免DSO问题
)

# 添加一个名为animal-farm的可执行文件目标，并指定其源文件
add_executable ( animal-farm animal-farm.cpp )

# 为目标animal-farm设置属性
set_target_properties ( animal-farm
  PROPERTIES
    CXX_STANDARD 14 # 指定C++标准为C++14
    CXX_EXTENSIONS OFF # 禁用编译器特定的扩展，仅使用ISO标准
    CXX_STANDARD_REQUIRED ON # 要求必须支持指定的标准，否则报错
)

# 将可执行文件animal-farm链接到共享库animals
target_link_libraries ( animal-farm animals )